/*
 * @Author: Chen Zoe
 * @Email: czh.zero@qq.com
 * @Date: 2025-03-03 14:31:30
 * @Description: st7789 driver for IDF4.4 + LVGL8.3
 */
#ifndef __LCD_ST7789_H
#define __LCD_ST7789_H

#ifdef __cplusplus
extern "C" {
#endif

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"

#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "driver/ledc.h"

#include "esp_err.h"
#include "esp_log.h"
#include "esp_timer.h"

// CMake依赖：PRIV_REQUIRES esp_lcd
#include "esp_lcd_panel_io.h"
#include "esp_lcd_panel_vendor.h"
#include "esp_lcd_panel_ops.h"

#include "lvgl.h"


// 全局显示句柄（提供给lv_disp_drv_t实例的user_data接口）
extern esp_lcd_panel_handle_t panel_handle;


// 引脚接口
#define LCD_SCLK_PIN    27
#define LCD_MOSI_PIN    33
#define LCD_CS_PIN      25
#define LCD_DC_PIN      26
#define LCD_RST_PIN     14      // 若无引脚连接至rst则设为 -1

// 背光控制
#define LCD_BLK_PWM_CTRL 1      // 若有引脚连接至blk背光控制，启用此宏并修改通道
#if LCD_BLK_PWM_CTRL
    #define LCD_BLK_PIN             32
    #define LCD_LEDC_TIMER          LEDC_TIMER_2
    #define LCD_LEDC_CHANNEL        LEDC_CHANNEL_2
    #define LCD_DEFAULT_BRIGHTNESS  128  // (0-255)
    void lcd_set_brightness(uint8_t brightness);    // 背光亮度控制
#endif

// 显示参数，注意：下面填写的应该是屏幕硬件参数，即屏幕宽下巴在下侧时水平像素和垂直像素！
#define LCD_H_RES       240     // 横轴像素
#define LCD_V_RES       320     // 纵轴像素
#define LCD_ROTATE      1       // 屏幕旋转（1：90°  2：180°  3：270°）

// 颜色调整
#define LCD_COLOR_BIT       16
#define LCD_COLOR_SPACE     ESP_LCD_COLOR_SPACE_RGB
#define LCD_COLOR_INVERT    false

// spi通道设置
#define LCD_SPI_PORT        SPI2_HOST           // SPI 通道
#define LCD_SPI_RATE        (80 * 1000 * 1000)  // SPI 速率


// 注意：以下内容无需修改！
#if LCD_ROTATE == 0     // 不旋转
    #define LVGL_H_PIXEL    LCD_H_RES
    #define LVGL_V_PIXEL    LCD_V_RES
    #define LCD_SWAP_XY     false
    #define LCD_MIRROR_X    false
    #define LCD_MIRROR_Y    false
#elif LCD_ROTATE == 1   // 90°旋转
    #define LVGL_H_PIXEL    LCD_V_RES
    #define LVGL_V_PIXEL    LCD_H_RES
    #define LCD_SWAP_XY     true
    #define LCD_MIRROR_X    true
    #define LCD_MIRROR_Y    false
#elif LCD_ROTATE == 2   // 180°旋转
    #define LVGL_H_PIXEL    LCD_H_RES
    #define LVGL_V_PIXEL    LCD_V_RES
    #define LCD_SWAP_XY     false
    #define LCD_MIRROR_X    true
    #define LCD_MIRROR_Y    true
#elif LCD_ROTATE == 3   // 270°旋转
    #define LVGL_H_PIXEL    LCD_V_RES
    #define LVGL_V_PIXEL    LCD_H_RES
    #define LCD_SWAP_XY     true
    #define LCD_MIRROR_X    false
    #define LCD_MIRROR_Y    true
#endif


/**
 * @brief lcd_st7789硬件接口初始化
 * @param {lv_disp_drv_t*} disp_drv  lvgl显示驱动实例
 */
esp_err_t lcd_st7789_init(lv_disp_drv_t* disp_drv);


/**
 * @brief lvgl的显示回调函数, 传递给 lv_indev_drv_t类型实例的 read_cb接口
 */
void disp_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);




#ifdef __cplusplus
}
#endif

#endif
